var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var ejs = require('ejs');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

//定义模板文件的存放路径
app.set('views', path.join(__dirname, 'views'));

//定义模板文件渲染引擎为EJS
app.set('view engine', 'ejs');

//可以重新定义EJS的开始和结束标签, 默认是 <% 和 %>
ejs.open = "{{";
ejs.close = "}}";

//可以重新定义EJS渲染文件的后缀, 默认是 *.ejs
app.engine("html", ejs.renderFile);

//定义网站标志图标
app.use(favicon());

app.use(logger('dev'));

//将传递的参数尽可能JSON化
app.use(bodyParser.json());

//将传递的参数转义
app.use(bodyParser.urlencoded());

//将Cookie加密, 可以带上自定义的密文
app.use(cookieParser());

//定义静态文件的路径. 如果根据页面的路径找不到文件,
//会自动在路径前加上这个静态路径再找一遍
app.use(express.static(path.join(__dirname, 'public')));

//可以将一些会在页面模板使用到的属性存在在res.locals.*中
//这样在页面模板中就可以直接使用locals.*获得
//一般可以定义网站模板的Title, Session等内容以方便在模板中获取
//req是Request, res是Response, next是下一个等处理的过滤链
app.use(function(req, res, next){
    res.locals.helloWorld = "Hello, Node.js";
    //注意使用next()让过滤链继续
    next();
})


//Node.js的路由
app.use('/', routes);
app.use('/users', users);

/// 捕获404
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

/// 错误信息处理

// 如果是在开发环境下, 捕获错误将会打印栈信息
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error.html', {
            message: err.message,
            error: err
        });
    });
}

// 在生产模式下, 将不会将栈信息输送到前台
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error.', {
        message: err.message,
        error: {}
    });
});

//在文件头使用require时, 默认返回的是module中的exports对象, module可以理解为当前上下文对象
//将app对象赋到module的exports中, 这样在别的文件中使用require('app')的时候默认返回的exports就是app
module.exports = app;
